    void game :: update()
{
    // once per frame, maybe less ?
    size_t size = Timers.size();
    //	for(vector<timer_state>::iterator i = Timers.begin(); i != Timers.end(); ++ i)
    //for(vector<timer_state>::iterator i = Timers.pool.begin(); i != Timers.pool.end(); ++ i)
    for (size_t i = 0; i < size; ++i)
	{
        //switch(Timers[i].state) // don't forget those are just checking for transitions
        switch(Timers[i].state) // don't forget those are just checking for transitions
		{
        case casting: 
			/* CHARGING ////////////////////////////////////////////////////////// */
            Timers[i].delay -= timeSinceLastFrame;
            bar.add_time(timeSinceLastFrame);
            if (Timers[i].delay < 0.f) // until cast charging is finished, decount
            {
                LOGMSG("casting ends");
                Abilities[Timers[i].abil].on_cooldown = false; // no more on cooldown
                cast_launch(Timers[i].emit, Timers[i].abil, Timers[i].target);
                Timers.rem(i); // mark timer as replaceable
                Timers[i].reset();
            }
			break;

		case cooldown:
			/* COOLDOWN ////////////////////////////////////////////////////////// */
            Timers[i].delay -= appli->timeSinceLastFrame;
            bar.add_time(timeSinceLastFrame);
            if (Timers[i].delay < 0.f)
            {
                LOGMSG("cooldown ends");
                Abilities[Timers[i].abil].on_cooldown = false; // no more on cooldown
                Timers.rem(i); // mark timers as replaceable
                Timers[i].reset();
            }
			break;
		
		case travel:
			/* TRAVEL /////////////////////////////////////////////////////////// */
                
			break;

		case dotted:
			/* DOTTED /////////////////////////////////////////////////////////// */
			Timers[i].delay -= timeSinceLastFrame;
            if(Timers[i].delay < 0.0f)
            {
                
                Timers[i].delay += TICK_TIME;
                Characters[Timers[i].target].life -= Abilities[Timers[i].abil].dmg_tick;
                LOGMSG("dot tick");
                -- Timers[i].ticks_left;
            }
            else if(Timers[i].ticks_left < 0)
            {	
                LOGMSG("last dot !");

            	Timers[i].reset();
                Timers.rem(i);
            }
			break;
        default:
            break; // on inactive enum state.
		}
	}
    // CHAR MASK ---- MOVING RUNNING FALLING STUNNED INVISIBLE STEALTH KNOCKED DEAD BLINDED SNARED

    for(std::vector<character_s>::iterator ch = Characters.begin(); ch != Characters.end(); ++ ch)
    {
        if(ch->life < 0)
        {
            ch->mask |= DEAD;
            string a = CharNames[std::distance(Characters.begin(), ch)];
            LOGMSG(a+" dies.");
        }
    }
}